package com.shujia.scala

object Demo8Fun {
  def main(args: Array[String]): Unit = {

    /**
      *
      *
      *
      * 什么是面向对象编程？
      * 将对象传来传去
      * 每一个方法都有类型限制
      * 对象是有类型的  "a" --->  String 类型
      *
      *
      * 面向函数编程
      * 将函数传来传去
      * 函数是由类型的   函数的类型由参数类型和返回值类中决定
      *
      *
      *
      */


    //这一个一个参数为String类型 返回最为Int类型的函数
    def fun(str: String): Int = {
      str.toInt
    }


    /**
      *
      * 高阶函数
      * 1、以函数作为参数
      * 2、以函数作为返回值
      *
      *
      */


    // 以函数作为参数
    //String => String  描述函数的类型    需要一个参数为String  返回值为String的函数
    def fun2(f: String => String): Unit = {

      //调用传进来函数
      val str = f("java")

      println(str)
    }


    //调用fun2  需要传递一个参数为String  返回值String 的函数进去

    def fun3(str: String): String = {

      "前缀：" + str

    }

    def fun4(str: String): String = {

      str + "：后缀"

    }


    fun2(fun3)
    fun2(fun4)



    //匿名函数   str => str + "后缀"
    //  str  的类型会自动推断出来
    fun2((str: String) => {
      str + "后缀"
    })

    fun2((str: String) => str + "后缀")

    fun2(str => str + "后缀")


    //当参数只被使用一次的时候可以通过 _ 代替   _ 代表一个占位符
    fun2( _ + "后缀")


  }

}
